1 /*
2 * Copyright (C) 2007 The Guava Authors
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 package com.google.common.collect;
18
19 import static com.google.common.base.Preconditions.checkArgument;
20 import static com.google.common.base.Preconditions.checkNotNull;
21 import static com.google.common.base.Preconditions.checkState;
22 import static com.google.common.base.Predicates.equalTo;
23 import static com.google.common.base.Predicates.in;
24 import static com.google.common.base.Predicates.instanceOf;
25 import static com.google.common.base.Predicates.not;
26 import static com.google.common.collect.CollectPreconditions.checkRemove;
27
28 import com.google.common.annotations.Beta;
29 import com.google.common.annotations.GwtCompatible;
30 import com.google.common.annotations.GwtIncompatible;
31 import com.google.common.base.Function;
32 import com.google.common.base.Objects;
33 import com.google.common.base.Optional;
34 import com.google.common.base.Preconditions;
35 import com.google.common.base.Predicate;
36
37 import java.util.Arrays;
38 import java.util.Collection;
39 import java.util.Collections;
40 import java.util.Comparator;
41 import java.util.Enumeration;
42 import java.util.Iterator;
43 import java.util.List;
44 import java.util.ListIterator;
45 import java.util.NoSuchElementException;
46 import java.util.PriorityQueue;
47 import java.util.Queue;
48
49 import javax.annotation.Nullable;
50
51 /**
52 * This class contains static utility methods that operate on or return objects
53 * of type {@link Iterator}. Except as noted, each method has a corresponding
54 * {@link Iterable}-based method in the {@link Iterables} class.
55 *
56 * <p><i>Performance notes:</i> Unless otherwise noted, all of the iterators
57 * produced in this class are <i>lazy</i>, which means that they only advance
58 * the backing iteration when absolutely necessary.
59 *
60 * <p>See the Guava User Guide section on <a href=
61 * "http://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained#Iterables">
62 * {@code Iterators}</a>.
63 *
64 * @author Kevin Bourrillion
65 * @author Jared Levy
66 * @since 2.0 (imported from Google Collections Library)
67 */
68 @GwtCompatible(emulated = true)
69 public final class Iterators {
70 private Iterators() {}
71
72 static final UnmodifiableListIterator<Object> EMPTY_LIST_ITERATOR
73 = new UnmodifiableListIterator<Object>() {
74 @Override
75 public boolean hasNext() {
76 return false;
77 }
78 @Override
79 public Object next() {
80 throw new NoSuchElementException();
81 }
82 @Override
83 public boolean hasPrevious() {
84 return false;
85 }
86 @Override
87 public Object previous() {
88 throw new NoSuchElementException();
89 }
90 @Override
91 public int nextIndex() {
92 return 0;
93 }
94 @Override
95 public int previousIndex() {
96 return -1;
97 }
98 };
99
100 /**
101 * Returns the empty iterator.
102 *
103 * <p>The {@link Iterable} equivalent of this method is {@link
104 * ImmutableSet#of()}.
105 *
106 * @deprecated Use {@code ImmutableSet.<T>of().iterator()} instead; or for
107 * Java 7 or later, {@link Collections#emptyIterator}. This method is
108 * scheduled for removal in May 2016.
109 */
110 @Deprecated
111 public static <T> UnmodifiableIterator<T> emptyIterator() {
112 return emptyListIterator();
113 }
114
115 /**
116 * Returns the empty iterator.
117 *
118 * <p>The {@link Iterable} equivalent of this method is {@link
119 * ImmutableSet#of()}.
120 */
121 // Casting to any type is safe since there are no actual elements.
122 @SuppressWarnings("unchecked")
123 static <T> UnmodifiableListIterator<T> emptyListIterator() {
124 return (UnmodifiableListIterator<T>) EMPTY_LIST_ITERATOR;
125 }
126
127 private static final Iterator<Object> EMPTY_MODIFIABLE_ITERATOR =
128 new Iterator<Object>() {
129 @Override public boolean hasNext() {
130 return false;
131 }
132
133 @Override public Object next() {
134 throw new NoSuchElementException();
135 }
136
137 @Override public void remove() {
138 checkRemove(false);
139 }
140 };
141
142 /**
143 * Returns the empty {@code Iterator} that throws
144 * {@link IllegalStateException} instead of
145 * {@link UnsupportedOperationException} on a call to
146 * {@link Iterator#remove()}.
147 */
148 // Casting to any type is safe since there are no actual elements.
149 @SuppressWarnings("unchecked")
150 static <T> Iterator<T> emptyModifiableIterator() {
151 return (Iterator<T>) EMPTY_MODIFIABLE_ITERATOR;
152 }
153
154 /** Returns an unmodifiable view of {@code iterator}. */
155 public static <T> UnmodifiableIterator<T> unmodifiableIterator(
156 final Iterator<T> iterator) {
157 checkNotNull(iterator);
158 if (iterator instanceof UnmodifiableIterator) {
159 return (UnmodifiableIterator<T>) iterator;
160 }
161 return new UnmodifiableIterator<T>() {
162 @Override
163 public boolean hasNext() {
164 return iterator.hasNext();
165 }
166 @Override
167 public T next() {
168 return iterator.next();
169 }
170 };
171 }
172
173 /**
174 * Simply returns its argument.
175 *
176 * @deprecated no need to use this
177 * @since 10.0
178 */
179 @Deprecated public static <T> UnmodifiableIterator<T> unmodifiableIterator(
180 UnmodifiableIterator<T> iterator) {
181 return checkNotNull(iterator);
182 }
183
184 /**
185 * Returns the number of elements remaining in {@code iterator}. The iterator
186 * will be left exhausted: its {@code hasNext()} method will return
187 * {@code false}.
188 */
189 public static int size(Iterator<?> iterator) {
190 int count = 0;
191 while (iterator.hasNext()) {
192 iterator.next();
193 count++;
194 }
195 return count;
196 }
197
198 /**
199 * Returns {@code true} if {@code iterator} contains {@code element}.
200 */
201 public static boolean contains(Iterator<?> iterator, @Nullable Object element) {
202 return any(iterator, equalTo(element));
203 }
204
205 /**
206 * Traverses an iterator and removes every element that belongs to the
207 * provided collection. The iterator will be left exhausted: its
208 * {@code hasNext()} method will return {@code false}.
209 *
210 * @param removeFrom the iterator to (potentially) remove elements from
211 * @param elementsToRemove the elements to remove
212 * @return {@code true} if any element was removed from {@code iterator}
213 */
214 public static boolean removeAll(
215 Iterator<?> removeFrom, Collection<?> elementsToRemove) {
216 return removeIf(removeFrom, in(elementsToRemove));
217 }
218
219 /**
220 * Removes every element that satisfies the provided predicate from the
221 * iterator. The iterator will be left exhausted: its {@code hasNext()}
222 * method will return {@code false}.
223 *
224 * @param removeFrom the iterator to (potentially) remove elements from
225 * @param predicate a predicate that determines whether an element should
226 * be removed
227 * @return {@code true} if any elements were removed from the iterator
228 * @since 2.0
229 */
230 public static <T> boolean removeIf(
231 Iterator<T> removeFrom, Predicate<? super T> predicate) {
232 checkNotNull(predicate);
233 boolean modified = false;
234 while (removeFrom.hasNext()) {
235 if (predicate.apply(removeFrom.next())) {
236 removeFrom.remove();
237 modified = true;
238 }
239 }
240 return modified;
241 }
242
243 /**
244 * Traverses an iterator and removes every element that does not belong to the
245 * provided collection. The iterator will be left exhausted: its
246 * {@code hasNext()} method will return {@code false}.
247 *
248 * @param removeFrom the iterator to (potentially) remove elements from
249 * @param elementsToRetain the elements to retain
250 * @return {@code true} if any element was removed from {@code iterator}
251 */
252 public static boolean retainAll(
253 Iterator<?> removeFrom, Collection<?> elementsToRetain) {
254 return removeIf(removeFrom, not(in(elementsToRetain)));
255 }
256
257 /**
258 * Determines whether two iterators contain equal elements in the same order.
259 * More specifically, this method returns {@code true} if {@code iterator1}
260 * and {@code iterator2} contain the same number of elements and every element
261 * of {@code iterator1} is equal to the corresponding element of
262 * {@code iterator2}.
263 *
264 * <p>Note that this will modify the supplied iterators, since they will have
265 * been advanced some number of elements forward.
266 */
267 public static boolean elementsEqual(
268 Iterator<?> iterator1, Iterator<?> iterator2) {
269 while (iterator1.hasNext()) {
270 if (!iterator2.hasNext()) {
271 return false;
272 }
273 Object o1 = iterator1.next();
274 Object o2 = iterator2.next();
275 if (!Objects.equal(o1, o2)) {
276 return false;
277 }
278 }
279 return !iterator2.hasNext();
280 }
281
282 /**
283 * Returns a string representation of {@code iterator}, with the format
284 * {@code [e1, e2, ..., en]}. The iterator will be left exhausted: its
285 * {@code hasNext()} method will return {@code false}.
286 */
287 public static String toString(Iterator<?> iterator) {
288 return Collections2.STANDARD_JOINER
289 .appendTo(new StringBuilder().append('['), iterator)
290 .append(']')
291 .toString();
292 }
293
294 /**
295 * Returns the single element contained in {@code iterator}.
296 *
297 * @throws NoSuchElementException if the iterator is empty
298 * @throws IllegalArgumentException if the iterator contains multiple
299 * elements. The state of the iterator is unspecified.
300 */
301 public static <T> T getOnlyElement(Iterator<T> iterator) {
302 T first = iterator.next();
303 if (!iterator.hasNext()) {
304 return first;
305 }
306
307 StringBuilder sb = new StringBuilder();
308 sb.append("expected one element but was: <" + first);
309 for (int i = 0; i < 4 && iterator.hasNext(); i++) {
310 sb.append(", " + iterator.next());
311 }
312 if (iterator.hasNext()) {
313 sb.append(", ...");
314 }
315 sb.append('>');
316
317 throw new IllegalArgumentException(sb.toString());
318 }
319
320 /**
321 * Returns the single element contained in {@code iterator}, or {@code
322 * defaultValue} if the iterator is empty.
323 *
324 * @throws IllegalArgumentException if the iterator contains multiple
325 * elements. The state of the iterator is unspecified.
326 */
327 @Nullable
328 public static <T> T getOnlyElement(Iterator<? extends T> iterator, @Nullable T defaultValue) {
329 return iterator.hasNext() ? getOnlyElement(iterator) : defaultValue;
330 }
331
332 /**
333 * Copies an iterator's elements into an array. The iterator will be left
334 * exhausted: its {@code hasNext()} method will return {@code false}.
335 *
336 * @param iterator the iterator to copy
337 * @param type the type of the elements
338 * @return a newly-allocated array into which all the elements of the iterator
339 * have been copied
340 */
341 @GwtIncompatible("Array.newInstance(Class, int)")
342 public static <T> T[] toArray(
343 Iterator<? extends T> iterator, Class<T> type) {
344 List<T> list = Lists.newArrayList(iterator);
345 return Iterables.toArray(list, type);
346 }
347
348 /**
349 * Adds all elements in {@code iterator} to {@code collection}. The iterator
350 * will be left exhausted: its {@code hasNext()} method will return
351 * {@code false}.
352 *
353 * @return {@code true} if {@code collection} was modified as a result of this
354 * operation
355 */
356 public static <T> boolean addAll(
357 Collection<T> addTo, Iterator<? extends T> iterator) {
358 checkNotNull(addTo);
359 checkNotNull(iterator);
360 boolean wasModified = false;
361 while (iterator.hasNext()) {
362 wasModified |= addTo.add(iterator.next());
363 }
364 return wasModified;
365 }
366
367 /**
368 * Returns the number of elements in the specified iterator that equal the
369 * specified object. The iterator will be left exhausted: its
370 * {@code hasNext()} method will return {@code false}.
371 *
372 * @see Collections#frequency
373 */
374 public static int frequency(Iterator<?> iterator, @Nullable Object element) {
375 return size(filter(iterator, equalTo(element)));
376 }
377
378 /**
379 * Returns an iterator that cycles indefinitely over the elements of {@code
380 * iterable}.
381 *
382 * <p>The returned iterator supports {@code remove()} if the provided iterator
383 * does. After {@code remove()} is called, subsequent cycles omit the removed
384 * element, which is no longer in {@code iterable}. The iterator's
385 * {@code hasNext()} method returns {@code true} until {@code iterable} is
386 * empty.
387 *
388 * <p><b>Warning:</b> Typical uses of the resulting iterator may produce an
389 * infinite loop. You should use an explicit {@code break} or be certain that
390 * you will eventually remove all the elements.
391 */
392 public static <T> Iterator<T> cycle(final Iterable<T> iterable) {
393 checkNotNull(iterable);
394 return new Iterator<T>() {
395 Iterator<T> iterator = emptyIterator();
396 Iterator<T> removeFrom;
397
398 @Override
399 public boolean hasNext() {
400 if (!iterator.hasNext()) {
401 iterator = iterable.iterator();
402 }
403 return iterator.hasNext();
404 }
405 @Override
406 public T next() {
407 if (!hasNext()) {
408 throw new NoSuchElementException();
409 }
410 removeFrom = iterator;
411 return iterator.next();
412 }
413 @Override
414 public void remove() {
415 checkRemove(removeFrom != null);
416 removeFrom.remove();
417 removeFrom = null;
418 }
419 };
420 }
421
422 /**
423 * Returns an iterator that cycles indefinitely over the provided elements.
424 *
425 * <p>The returned iterator supports {@code remove()}. After {@code remove()}
426 * is called, subsequent cycles omit the removed
427 * element, but {@code elements} does not change. The iterator's
428 * {@code hasNext()} method returns {@code true} until all of the original
429 * elements have been removed.
430 *
431 * <p><b>Warning:</b> Typical uses of the resulting iterator may produce an
432 * infinite loop. You should use an explicit {@code break} or be certain that
433 * you will eventually remove all the elements.
434 */
435 public static <T> Iterator<T> cycle(T... elements) {
436 return cycle(Lists.newArrayList(elements));
437 }
438
439 /**
440 * Combines two iterators into a single iterator. The returned iterator
441 * iterates across the elements in {@code a}, followed by the elements in
442 * {@code b}. The source iterators are not polled until necessary.
443 *
444 * <p>The returned iterator supports {@code remove()} when the corresponding
445 * input iterator supports it.
446 *
447 * <p><b>Note:</b> the current implementation is not suitable for nested
448 * concatenated iterators, i.e. the following should be avoided when in a loop:
449 * {@code iterator = Iterators.concat(iterator, suffix);}, since iteration over the
450 * resulting iterator has a cubic complexity to the depth of the nesting.
451 */
452 public static <T> Iterator<T> concat(Iterator<? extends T> a,
453 Iterator<? extends T> b) {
454 return concat(ImmutableList.of(a, b).iterator());
455 }
456
457 /**
458 * Combines three iterators into a single iterator. The returned iterator
459 * iterates across the elements in {@code a}, followed by the elements in
460 * {@code b}, followed by the elements in {@code c}. The source iterators
461 * are not polled until necessary.
462 *
463 * <p>The returned iterator supports {@code remove()} when the corresponding
464 * input iterator supports it.
465 *
466 * <p><b>Note:</b> the current implementation is not suitable for nested
467 * concatenated iterators, i.e. the following should be avoided when in a loop:
468 * {@code iterator = Iterators.concat(iterator, suffix);}, since iteration over the
469 * resulting iterator has a cubic complexity to the depth of the nesting.
470 */
471 public static <T> Iterator<T> concat(Iterator<? extends T> a,
472 Iterator<? extends T> b, Iterator<? extends T> c) {
473 return concat(ImmutableList.of(a, b, c).iterator());
474 }
475
476 /**
477 * Combines four iterators into a single iterator. The returned iterator
478 * iterates across the elements in {@code a}, followed by the elements in
479 * {@code b}, followed by the elements in {@code c}, followed by the elements
480 * in {@code d}. The source iterators are not polled until necessary.
481 *
482 * <p>The returned iterator supports {@code remove()} when the corresponding
483 * input iterator supports it.
484 *
485 * <p><b>Note:</b> the current implementation is not suitable for nested
486 * concatenated iterators, i.e. the following should be avoided when in a loop:
487 * {@code iterator = Iterators.concat(iterator, suffix);}, since iteration over the
488 * resulting iterator has a cubic complexity to the depth of the nesting.
489 */
490 public static <T> Iterator<T> concat(Iterator<? extends T> a,
491 Iterator<? extends T> b, Iterator<? extends T> c,
492 Iterator<? extends T> d) {
493 return concat(ImmutableList.of(a, b, c, d).iterator());
494 }
495
496 /**
497 * Combines multiple iterators into a single iterator. The returned iterator
498 * iterates across the elements of each iterator in {@code inputs}. The input
499 * iterators are not polled until necessary.
500 *
501 * <p>The returned iterator supports {@code remove()} when the corresponding
502 * input iterator supports it.
503 *
504 * <p><b>Note:</b> the current implementation is not suitable for nested
505 * concatenated iterators, i.e. the following should be avoided when in a loop:
506 * {@code iterator = Iterators.concat(iterator, suffix);}, since iteration over the
507 * resulting iterator has a cubic complexity to the depth of the nesting.
508 *
509 * @throws NullPointerException if any of the provided iterators is null
510 */
511 public static <T> Iterator<T> concat(Iterator<? extends T>... inputs) {
512 return concat(ImmutableList.copyOf(inputs).iterator());
513 }
514
515 /**
516 * Combines multiple iterators into a single iterator. The returned iterator
517 * iterates across the elements of each iterator in {@code inputs}. The input
518 * iterators are not polled until necessary.
519 *
520 * <p>The returned iterator supports {@code remove()} when the corresponding
521 * input iterator supports it. The methods of the returned iterator may throw
522 * {@code NullPointerException} if any of the input iterators is null.
523 *
524 * <p><b>Note:</b> the current implementation is not suitable for nested
525 * concatenated iterators, i.e. the following should be avoided when in a loop:
526 * {@code iterator = Iterators.concat(iterator, suffix);}, since iteration over the
527 * resulting iterator has a cubic complexity to the depth of the nesting.
528 */
529 public static <T> Iterator<T> concat(
530 final Iterator<? extends Iterator<? extends T>> inputs) {
531 checkNotNull(inputs);
532 return new Iterator<T>() {
533 Iterator<? extends T> current = emptyIterator();
534 Iterator<? extends T> removeFrom;
535
536 @Override
537 public boolean hasNext() {
538 // http://code.google.com/p/google-collections/issues/detail?id=151
539 // current.hasNext() might be relatively expensive, worth minimizing.
540 boolean currentHasNext;
541 // checkNotNull eager for GWT
542 // note: it must be here & not where 'current' is assigned,
543 // because otherwise we'll have called inputs.next() before throwing
544 // the first NPE, and the next time around we'll call inputs.next()
545 // again, incorrectly moving beyond the error.
546 while (!(currentHasNext = checkNotNull(current).hasNext())
547 && inputs.hasNext()) {
548 current = inputs.next();
549 }
550 return currentHasNext;
551 }
552 @Override
553 public T next() {
554 if (!hasNext()) {
555 throw new NoSuchElementException();
556 }
557 removeFrom = current;
558 return current.next();
559 }
560 @Override
561 public void remove() {
562 checkRemove(removeFrom != null);
563 removeFrom.remove();
564 removeFrom = null;
565 }
566 };
567 }
568
569 /**
570 * Divides an iterator into unmodifiable sublists of the given size (the final
571 * list may be smaller). For example, partitioning an iterator containing
572 * {@code [a, b, c, d, e]} with a partition size of 3 yields {@code
573 * [[a, b, c], [d, e]]} -- an outer iterator containing two inner lists of
574 * three and two elements, all in the original order.
575 *
576 * <p>The returned lists implement {@link java.util.RandomAccess}.
577 *
578 * @param iterator the iterator to return a partitioned view of
579 * @param size the desired size of each partition (the last may be smaller)
580 * @return an iterator of immutable lists containing the elements of {@code
581 * iterator} divided into partitions
582 * @throws IllegalArgumentException if {@code size} is nonpositive
583 */
584 public static <T> UnmodifiableIterator<List<T>> partition(
585 Iterator<T> iterator, int size) {
586 return partitionImpl(iterator, size, false);
587 }
588
589 /**
590 * Divides an iterator into unmodifiable sublists of the given size, padding
591 * the final iterator with null values if necessary. For example, partitioning
592 * an iterator containing {@code [a, b, c, d, e]} with a partition size of 3
593 * yields {@code [[a, b, c], [d, e, null]]} -- an outer iterator containing
594 * two inner lists of three elements each, all in the original order.
595 *
596 * <p>The returned lists implement {@link java.util.RandomAccess}.
597 *
598 * @param iterator the iterator to return a partitioned view of
599 * @param size the desired size of each partition
600 * @return an iterator of immutable lists containing the elements of {@code
601 * iterator} divided into partitions (the final iterable may have
602 * trailing null elements)
603 * @throws IllegalArgumentException if {@code size} is nonpositive
604 */
605 public static <T> UnmodifiableIterator<List<T>> paddedPartition(
606 Iterator<T> iterator, int size) {
607 return partitionImpl(iterator, size, true);
608 }
609
610 private static <T> UnmodifiableIterator<List<T>> partitionImpl(
611 final Iterator<T> iterator, final int size, final boolean pad) {
612 checkNotNull(iterator);
613 checkArgument(size > 0);
614 return new UnmodifiableIterator<List<T>>() {
615 @Override
616 public boolean hasNext() {
617 return iterator.hasNext();
618 }
619 @Override
620 public List<T> next() {
621 if (!hasNext()) {
622 throw new NoSuchElementException();
623 }
624 Object[] array = new Object[size];
625 int count = 0;
626 for (; count < size && iterator.hasNext(); count++) {
627 array[count] = iterator.next();
628 }
629 for (int i = count; i < size; i++) {
630 array[i] = null; // for GWT
631 }
632
633 @SuppressWarnings("unchecked") // we only put Ts in it
634 List<T> list = Collections.unmodifiableList(
635 (List<T>) Arrays.asList(array));
636 return (pad || count == size) ? list : list.subList(0, count);
637 }
638 };
639 }
640
641 /**
642 * Returns the elements of {@code unfiltered} that satisfy a predicate.
643 */
644 public static <T> UnmodifiableIterator<T> filter(
645 final Iterator<T> unfiltered, final Predicate<? super T> predicate) {
646 checkNotNull(unfiltered);
647 checkNotNull(predicate);
648 return new AbstractIterator<T>() {
649 @Override protected T computeNext() {
650 while (unfiltered.hasNext()) {
651 T element = unfiltered.next();
652 if (predicate.apply(element)) {
653 return element;
654 }
655 }
656 return endOfData();
657 }
658 };
659 }
660
661 /**
662 * Returns all instances of class {@code type} in {@code unfiltered}. The
663 * returned iterator has elements whose class is {@code type} or a subclass of
664 * {@code type}.
665 *
666 * @param unfiltered an iterator containing objects of any type
667 * @param type the type of elements desired
668 * @return an unmodifiable iterator containing all elements of the original
669 * iterator that were of the requested type
670 */
671 @SuppressWarnings("unchecked") // can cast to <T> because non-Ts are removed
672 @GwtIncompatible("Class.isInstance")
673 public static <T> UnmodifiableIterator<T> filter(
674 Iterator<?> unfiltered, Class<T> type) {
675 return (UnmodifiableIterator<T>) filter(unfiltered, instanceOf(type));
676 }
677
678 /**
679 * Returns {@code true} if one or more elements returned by {@code iterator}
680 * satisfy the given predicate.
681 */
682 public static <T> boolean any(
683 Iterator<T> iterator, Predicate<? super T> predicate) {
684 return indexOf(iterator, predicate) != -1;
685 }
686
687 /**
688 * Returns {@code true} if every element returned by {@code iterator}
689 * satisfies the given predicate. If {@code iterator} is empty, {@code true}
690 * is returned.
691 */
692 public static <T> boolean all(
693 Iterator<T> iterator, Predicate<? super T> predicate) {
694 checkNotNull(predicate);
695 while (iterator.hasNext()) {
696 T element = iterator.next();
697 if (!predicate.apply(element)) {
698 return false;
699 }
700 }
701 return true;
702 }
703
704 /**
705 * Returns the first element in {@code iterator} that satisfies the given
706 * predicate; use this method only when such an element is known to exist. If
707 * no such element is found, the iterator will be left exhausted: its {@code
708 * hasNext()} method will return {@code false}. If it is possible that
709 * <i>no</i> element will match, use {@link #tryFind} or {@link
710 * #find(Iterator, Predicate, Object)} instead.
711 *
712 * @throws NoSuchElementException if no element in {@code iterator} matches
713 * the given predicate
714 */
715 public static <T> T find(
716 Iterator<T> iterator, Predicate<? super T> predicate) {
717 return filter(iterator, predicate).next();
718 }
719
720 /**
721 * Returns the first element in {@code iterator} that satisfies the given
722 * predicate. If no such element is found, {@code defaultValue} will be
723 * returned from this method and the iterator will be left exhausted: its
724 * {@code hasNext()} method will return {@code false}. Note that this can
725 * usually be handled more naturally using {@code
726 * tryFind(iterator, predicate).or(defaultValue)}.
727 *
728 * @since 7.0
729 */
730 @Nullable
731 public static <T> T find(Iterator<? extends T> iterator, Predicate<? super T> predicate,
732 @Nullable T defaultValue) {
733 return getNext(filter(iterator, predicate), defaultValue);
734 }
735
736 /**
737 * Returns an {@link Optional} containing the first element in {@code
738 * iterator} that satisfies the given predicate, if such an element exists. If
739 * no such element is found, an empty {@link Optional} will be returned from
740 * this method and the iterator will be left exhausted: its {@code
741 * hasNext()} method will return {@code false}.
742 *
743 * <p><b>Warning:</b> avoid using a {@code predicate} that matches {@code
744 * null}. If {@code null} is matched in {@code iterator}, a
745 * NullPointerException will be thrown.
746 *
747 * @since 11.0
748 */
749 public static <T> Optional<T> tryFind(
750 Iterator<T> iterator, Predicate<? super T> predicate) {
751 UnmodifiableIterator<T> filteredIterator = filter(iterator, predicate);
752 return filteredIterator.hasNext()
753 ? Optional.of(filteredIterator.next())
754 : Optional.<T>absent();
755 }
756
757 /**
758 * Returns the index in {@code iterator} of the first element that satisfies
759 * the provided {@code predicate}, or {@code -1} if the Iterator has no such
760 * elements.
761 *
762 * <p>More formally, returns the lowest index {@code i} such that
763 * {@code predicate.apply(Iterators.get(iterator, i))} returns {@code true},
764 * or {@code -1} if there is no such index.
765 *
766 * <p>If -1 is returned, the iterator will be left exhausted: its
767 * {@code hasNext()} method will return {@code false}. Otherwise,
768 * the iterator will be set to the element which satisfies the
769 * {@code predicate}.
770 *
771 * @since 2.0
772 */
773 public static <T> int indexOf(
774 Iterator<T> iterator, Predicate<? super T> predicate) {
775 checkNotNull(predicate, "predicate");
776 for (int i = 0; iterator.hasNext(); i++) {
777 T current = iterator.next();
778 if (predicate.apply(current)) {
779 return i;
780 }
781 }
782 return -1;
783 }
784
785 /**
786 * Returns an iterator that applies {@code function} to each element of {@code
787 * fromIterator}.
788 *
789 * <p>The returned iterator supports {@code remove()} if the provided iterator
790 * does. After a successful {@code remove()} call, {@code fromIterator} no
791 * longer contains the corresponding element.
792 */
793 public static <F, T> Iterator<T> transform(final Iterator<F> fromIterator,
794 final Function<? super F, ? extends T> function) {
795 checkNotNull(function);
796 return new TransformedIterator<F, T>(fromIterator) {
797 @Override
798 T transform(F from) {
799 return function.apply(from);
800 }
801 };
802 }
803
804 /**
805 * Advances {@code iterator} {@code position + 1} times, returning the
806 * element at the {@code position}th position.
807 *
808 * @param position position of the element to return
809 * @return the element at the specified position in {@code iterator}
810 * @throws IndexOutOfBoundsException if {@code position} is negative or
811 * greater than or equal to the number of elements remaining in
812 * {@code iterator}
813 */
814 public static <T> T get(Iterator<T> iterator, int position) {
815 checkNonnegative(position);
816 int skipped = advance(iterator, position);
817 if (!iterator.hasNext()) {
818 throw new IndexOutOfBoundsException("position (" + position
819 + ") must be less than the number of elements that remained ("
820 + skipped + ")");
821 }
822 return iterator.next();
823 }
824
825 static void checkNonnegative(int position) {
826 if (position < 0) {
827 throw new IndexOutOfBoundsException("position (" + position
828 + ") must not be negative");
829 }
830 }
831
832 /**
833 * Advances {@code iterator} {@code position + 1} times, returning the
834 * element at the {@code position}th position or {@code defaultValue}
835 * otherwise.
836 *
837 * @param position position of the element to return
838 * @param defaultValue the default value to return if the iterator is empty
839 * or if {@code position} is greater than the number of elements
840 * remaining in {@code iterator}
841 * @return the element at the specified position in {@code iterator} or
842 * {@code defaultValue} if {@code iterator} produces fewer than
843 * {@code position + 1} elements.
844 * @throws IndexOutOfBoundsException if {@code position} is negative
845 * @since 4.0
846 */
847 @Nullable
848 public static <T> T get(Iterator<? extends T> iterator, int position, @Nullable T defaultValue) {
849 checkNonnegative(position);
850 advance(iterator, position);
851 return getNext(iterator, defaultValue);
852 }
853
854 /**
855 * Returns the next element in {@code iterator} or {@code defaultValue} if
856 * the iterator is empty. The {@link Iterables} analog to this method is
857 * {@link Iterables#getFirst}.
858 *
859 * @param defaultValue the default value to return if the iterator is empty
860 * @return the next element of {@code iterator} or the default value
861 * @since 7.0
862 */
863 @Nullable
864 public static <T> T getNext(Iterator<? extends T> iterator, @Nullable T defaultValue) {
865 return iterator.hasNext() ? iterator.next() : defaultValue;
866 }
867
868 /**
869 * Advances {@code iterator} to the end, returning the last element.
870 *
871 * @return the last element of {@code iterator}
872 * @throws NoSuchElementException if the iterator is empty
873 */
874 public static <T> T getLast(Iterator<T> iterator) {
875 while (true) {
876 T current = iterator.next();
877 if (!iterator.hasNext()) {
878 return current;
879 }
880 }
881 }
882
883 /**
884 * Advances {@code iterator} to the end, returning the last element or
885 * {@code defaultValue} if the iterator is empty.
886 *
887 * @param defaultValue the default value to return if the iterator is empty
888 * @return the last element of {@code iterator}
889 * @since 3.0
890 */
891 @Nullable
892 public static <T> T getLast(Iterator<? extends T> iterator, @Nullable T defaultValue) {
893 return iterator.hasNext() ? getLast(iterator) : defaultValue;
894 }
895
896 /**
897 * Calls {@code next()} on {@code iterator}, either {@code numberToAdvance} times
898 * or until {@code hasNext()} returns {@code false}, whichever comes first.
899 *
900 * @return the number of elements the iterator was advanced
901 * @since 13.0 (since 3.0 as {@code Iterators.skip})
902 */
903 public static int advance(Iterator<?> iterator, int numberToAdvance) {
904 checkNotNull(iterator);
905 checkArgument(numberToAdvance >= 0, "numberToAdvance must be nonnegative");
906
907 int i;
908 for (i = 0; i < numberToAdvance && iterator.hasNext(); i++) {
909 iterator.next();
910 }
911 return i;
912 }
913
914 /**
915 * Creates an iterator returning the first {@code limitSize} elements of the
916 * given iterator. If the original iterator does not contain that many
917 * elements, the returned iterator will have the same behavior as the original
918 * iterator. The returned iterator supports {@code remove()} if the original
919 * iterator does.
920 *
921 * @param iterator the iterator to limit
922 * @param limitSize the maximum number of elements in the returned iterator
923 * @throws IllegalArgumentException if {@code limitSize} is negative
924 * @since 3.0
925 */
926 public static <T> Iterator<T> limit(
927 final Iterator<T> iterator, final int limitSize) {
928 checkNotNull(iterator);
929 checkArgument(limitSize >= 0, "limit is negative");
930 return new Iterator<T>() {
931 private int count;
932
933 @Override
934 public boolean hasNext() {
935 return count < limitSize && iterator.hasNext();
936 }
937
938 @Override
939 public T next() {
940 if (!hasNext()) {
941 throw new NoSuchElementException();
942 }
943 count++;
944 return iterator.next();
945 }
946
947 @Override
948 public void remove() {
949 iterator.remove();
950 }
951 };
952 }
953
954 /**
955 * Returns a view of the supplied {@code iterator} that removes each element
956 * from the supplied {@code iterator} as it is returned.
957 *
958 * <p>The provided iterator must support {@link Iterator#remove()} or
959 * else the returned iterator will fail on the first call to {@code
960 * next}.
961 *
962 * @param iterator the iterator to remove and return elements from
963 * @return an iterator that removes and returns elements from the
964 * supplied iterator
965 * @since 2.0
966 */
967 public static <T> Iterator<T> consumingIterator(final Iterator<T> iterator) {
968 checkNotNull(iterator);
969 return new UnmodifiableIterator<T>() {
970 @Override
971 public boolean hasNext() {
972 return iterator.hasNext();
973 }
974
975 @Override
976 public T next() {
977 T next = iterator.next();
978 iterator.remove();
979 return next;
980 }
981
982 @Override
983 public String toString() {
984 return "Iterators.consumingIterator(...)";
985 }
986 };
987 }
988
989 /**
990 * Deletes and returns the next value from the iterator, or returns
991 * {@code null} if there is no such value.
992 */
993 @Nullable
994 static <T> T pollNext(Iterator<T> iterator) {
995 if (iterator.hasNext()) {
996 T result = iterator.next();
997 iterator.remove();
998 return result;
999 } else {
1000 return null;
1001 }
1002 }
1003
1004 // Methods only in Iterators, not in Iterables
1005
1006 /**
1007 * Clears the iterator using its remove method.
1008 */
1009 static void clear(Iterator<?> iterator) {
1010 checkNotNull(iterator);
1011 while (iterator.hasNext()) {
1012 iterator.next();
1013 iterator.remove();
1014 }
1015 }
1016
1017 /**
1018 * Returns an iterator containing the elements of {@code array} in order. The
1019 * returned iterator is a view of the array; subsequent changes to the array
1020 * will be reflected in the iterator.
1021 *
1022 * <p><b>Note:</b> It is often preferable to represent your data using a
1023 * collection type, for example using {@link Arrays#asList(Object[])}, making
1024 * this method unnecessary.
1025 *
1026 * <p>The {@code Iterable} equivalent of this method is either {@link
1027 * Arrays#asList(Object[])}, {@link ImmutableList#copyOf(Object[])}},
1028 * or {@link ImmutableList#of}.
1029 */
1030 public static <T> UnmodifiableIterator<T> forArray(final T... array) {
1031 return forArray(array, 0, array.length, 0);
1032 }
1033
1034 /**
1035 * Returns a list iterator containing the elements in the specified range of
1036 * {@code array} in order, starting at the specified index.
1037 *
1038 * <p>The {@code Iterable} equivalent of this method is {@code
1039 * Arrays.asList(array).subList(offset, offset + length).listIterator(index)}.
1040 */
1041 static <T> UnmodifiableListIterator<T> forArray(
1042 final T[] array, final int offset, int length, int index) {
1043 checkArgument(length >= 0);
1044 int end = offset + length;
1045
1046 // Technically we should give a slightly more descriptive error on overflow
1047 Preconditions.checkPositionIndexes(offset, end, array.length);
1048 Preconditions.checkPositionIndex(index, length);
1049 if (length == 0) {
1050 return emptyListIterator();
1051 }
1052
1053 /*
1054 * We can't use call the two-arg constructor with arguments (offset, end)
1055 * because the returned Iterator is a ListIterator that may be moved back
1056 * past the beginning of the iteration.
1057 */
1058 return new AbstractIndexedListIterator<T>(length, index) {
1059 @Override protected T get(int index) {
1060 return array[offset + index];
1061 }
1062 };
1063 }
1064
1065 /**
1066 * Returns an iterator containing only {@code value}.
1067 *
1068 * <p>The {@link Iterable} equivalent of this method is {@link
1069 * Collections#singleton}.
1070 */
1071 public static <T> UnmodifiableIterator<T> singletonIterator(
1072 @Nullable final T value) {
1073 return new UnmodifiableIterator<T>() {
1074 boolean done;
1075 @Override
1076 public boolean hasNext() {
1077 return !done;
1078 }
1079 @Override
1080 public T next() {
1081 if (done) {
1082 throw new NoSuchElementException();
1083 }
1084 done = true;
1085 return value;
1086 }
1087 };
1088 }
1089
1090 /**
1091 * Adapts an {@code Enumeration} to the {@code Iterator} interface.
1092 *
1093 * <p>This method has no equivalent in {@link Iterables} because viewing an
1094 * {@code Enumeration} as an {@code Iterable} is impossible. However, the
1095 * contents can be <i>copied</i> into a collection using {@link
1096 * Collections#list}.
1097 */
1098 public static <T> UnmodifiableIterator<T> forEnumeration(
1099 final Enumeration<T> enumeration) {
1100 checkNotNull(enumeration);
1101 return new UnmodifiableIterator<T>() {
1102 @Override
1103 public boolean hasNext() {
1104 return enumeration.hasMoreElements();
1105 }
1106 @Override
1107 public T next() {
1108 return enumeration.nextElement();
1109 }
1110 };
1111 }
1112
1113 /**
1114 * Adapts an {@code Iterator} to the {@code Enumeration} interface.
1115 *
1116 * <p>The {@code Iterable} equivalent of this method is either {@link
1117 * Collections#enumeration} (if you have a {@link Collection}), or
1118 * {@code Iterators.asEnumeration(collection.iterator())}.
1119 */
1120 public static <T> Enumeration<T> asEnumeration(final Iterator<T> iterator) {
1121 checkNotNull(iterator);
1122 return new Enumeration<T>() {
1123 @Override
1124 public boolean hasMoreElements() {
1125 return iterator.hasNext();
1126 }
1127 @Override
1128 public T nextElement() {
1129 return iterator.next();
1130 }
1131 };
1132 }
1133
1134 /**
1135 * Implementation of PeekingIterator that avoids peeking unless necessary.
1136 */
1137 private static class PeekingImpl<E> implements PeekingIterator<E> {
1138
1139 private final Iterator<? extends E> iterator;
1140 private boolean hasPeeked;
1141 private E peekedElement;
1142
1143 public PeekingImpl(Iterator<? extends E> iterator) {
1144 this.iterator = checkNotNull(iterator);
1145 }
1146
1147 @Override
1148 public boolean hasNext() {
1149 return hasPeeked || iterator.hasNext();
1150 }
1151
1152 @Override
1153 public E next() {
1154 if (!hasPeeked) {
1155 return iterator.next();
1156 }
1157 E result = peekedElement;
1158 hasPeeked = false;
1159 peekedElement = null;
1160 return result;
1161 }
1162
1163 @Override
1164 public void remove() {
1165 checkState(!hasPeeked, "Can't remove after you've peeked at next");
1166 iterator.remove();
1167 }
1168
1169 @Override
1170 public E peek() {
1171 if (!hasPeeked) {
1172 peekedElement = iterator.next();
1173 hasPeeked = true;
1174 }
1175 return peekedElement;
1176 }
1177 }
1178
1179 /**
1180 * Returns a {@code PeekingIterator} backed by the given iterator.
1181 *
1182 * <p>Calls to the {@code peek} method with no intervening calls to {@code
1183 * next} do not affect the iteration, and hence return the same object each
1184 * time. A subsequent call to {@code next} is guaranteed to return the same
1185 * object again. For example: <pre> {@code
1186 *
1187 * PeekingIterator<String> peekingIterator =
1188 * Iterators.peekingIterator(Iterators.forArray("a", "b"));
1189 * String a1 = peekingIterator.peek(); // returns "a"
1190 * String a2 = peekingIterator.peek(); // also returns "a"
1191 * String a3 = peekingIterator.next(); // also returns "a"}</pre>
1192 *
1193 * <p>Any structural changes to the underlying iteration (aside from those
1194 * performed by the iterator's own {@link PeekingIterator#remove()} method)
1195 * will leave the iterator in an undefined state.
1196 *
1197 * <p>The returned iterator does not support removal after peeking, as
1198 * explained by {@link PeekingIterator#remove()}.
1199 *
1200 * <p>Note: If the given iterator is already a {@code PeekingIterator},
1201 * it <i>might</i> be returned to the caller, although this is neither
1202 * guaranteed to occur nor required to be consistent. For example, this
1203 * method <i>might</i> choose to pass through recognized implementations of
1204 * {@code PeekingIterator} when the behavior of the implementation is
1205 * known to meet the contract guaranteed by this method.
1206 *
1207 * <p>There is no {@link Iterable} equivalent to this method, so use this
1208 * method to wrap each individual iterator as it is generated.
1209 *
1210 * @param iterator the backing iterator. The {@link PeekingIterator} assumes
1211 * ownership of this iterator, so users should cease making direct calls
1212 * to it after calling this method.
1213 * @return a peeking iterator backed by that iterator. Apart from the
1214 * additional {@link PeekingIterator#peek()} method, this iterator behaves
1215 * exactly the same as {@code iterator}.
1216 */
1217 public static <T> PeekingIterator<T> peekingIterator(
1218 Iterator<? extends T> iterator) {
1219 if (iterator instanceof PeekingImpl) {
1220 // Safe to cast <? extends T> to <T> because PeekingImpl only uses T
1221 // covariantly (and cannot be subclassed to add non-covariant uses).
1222 @SuppressWarnings("unchecked")
1223 PeekingImpl<T> peeking = (PeekingImpl<T>) iterator;
1224 return peeking;
1225 }
1226 return new PeekingImpl<T>(iterator);
1227 }
1228
1229 /**
1230 * Simply returns its argument.
1231 *
1232 * @deprecated no need to use this
1233 * @since 10.0
1234 */
1235 @Deprecated public static <T> PeekingIterator<T> peekingIterator(
1236 PeekingIterator<T> iterator) {
1237 return checkNotNull(iterator);
1238 }
1239
1240 /**
1241 * Returns an iterator over the merged contents of all given
1242 * {@code iterators}, traversing every element of the input iterators.
1243 * Equivalent entries will not be de-duplicated.
1244 *
1245 * <p>Callers must ensure that the source {@code iterators} are in
1246 * non-descending order as this method does not sort its input.
1247 *
1248 * <p>For any equivalent elements across all {@code iterators}, it is
1249 * undefined which element is returned first.
1250 *
1251 * @since 11.0
1252 */
1253 @Beta
1254 public static <T> UnmodifiableIterator<T> mergeSorted(
1255 Iterable<? extends Iterator<? extends T>> iterators,
1256 Comparator<? super T> comparator) {
1257 checkNotNull(iterators, "iterators");
1258 checkNotNull(comparator, "comparator");
1259
1260 return new MergingIterator<T>(iterators, comparator);
1261 }
1262
1263 /**
1264 * An iterator that performs a lazy N-way merge, calculating the next value
1265 * each time the iterator is polled. This amortizes the sorting cost over the
1266 * iteration and requires less memory than sorting all elements at once.
1267 *
1268 * <p>Retrieving a single element takes approximately O(log(M)) time, where M
1269 * is the number of iterators. (Retrieving all elements takes approximately
1270 * O(N*log(M)) time, where N is the total number of elements.)
1271 */
1272 private static class MergingIterator<T> extends UnmodifiableIterator<T> {
1273 final Queue<PeekingIterator<T>> queue;
1274
1275 public MergingIterator(Iterable<? extends Iterator<? extends T>> iterators,
1276 final Comparator<? super T> itemComparator) {
1277 // A comparator that's used by the heap, allowing the heap
1278 // to be sorted based on the top of each iterator.
1279 Comparator<PeekingIterator<T>> heapComparator =
1280 new Comparator<PeekingIterator<T>>() {
1281 @Override
1282 public int compare(PeekingIterator<T> o1, PeekingIterator<T> o2) {
1283 return itemComparator.compare(o1.peek(), o2.peek());
1284 }
1285 };
1286
1287 queue = new PriorityQueue<PeekingIterator<T>>(2, heapComparator);
1288
1289 for (Iterator<? extends T> iterator : iterators) {
1290 if (iterator.hasNext()) {
1291 queue.add(Iterators.peekingIterator(iterator));
1292 }
1293 }
1294 }
1295
1296 @Override
1297 public boolean hasNext() {
1298 return !queue.isEmpty();
1299 }
1300
1301 @Override
1302 public T next() {
1303 PeekingIterator<T> nextIter = queue.remove();
1304 T next = nextIter.next();
1305 if (nextIter.hasNext()) {
1306 queue.add(nextIter);
1307 }
1308 return next;
1309 }
1310 }
1311
1312 /**
1313 * Used to avoid http://bugs.sun.com/view_bug.do?bug_id=6558557
1314 */
1315 static <T> ListIterator<T> cast(Iterator<T> iterator) {
1316 return (ListIterator<T>) iterator;
1317 }
1318 }